package com.tinet.reservas;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import com.tinet.reservas.model.Reserva;
import com.tinet.reservas.model.Usuario;

/**
 * Dao de reserva.
 * 
 */
public class ReservaDao {
    /**
     * @param Entity
     *            Manager .
     * 
     */
    private EntityManager em;

    /**
     * @method constructor
     * @param em
     *            .
     * 
     */
    public ReservaDao(EntityManager em) {
        super();
        this.em = em;
    }

    /**
     * 
     * @method mostrarTodo
     * @return lista de reservas .
     * 
     */
    public List<Reserva> mostrarTodo() {
        Query q = em.createQuery("SELECT r FROM Reserva r");
        List<Reserva> lista = q.getResultList();
        return lista;

    }

    /**
     * 
     * @method mostrarReserva
     * @return objeto reserva .
     * @param reserva
     *            .
     */
    public Reserva mostrarReserva(Reserva reserva) {// este es mi buscar
        Query q = em.createQuery("SELECT r FROM Reserva r WHERE id=:idReserva");
        q.setParameter("idReserva", reserva.getId());
        Reserva reserv = (Reserva) q.getSingleResult();
        return reserv;
    }

    /**
     * 
     * @method buscarReserva
     * @return objeto reserva .
     * @param reserva
     *            .
     */
    public Reserva buscarReserva(Reserva reserva) { // este es mi buscar
        Query q =
                em.createQuery("SELECT r FROM Reserva r WHERE "
                        + "sala_id=:idSala AND fecha_reserva=:fecha");

        q.setParameter("idSala", reserva.getSalaId());
        q.setParameter("fecha", reserva.getFechaReserva());
        Reserva reserv = (Reserva) q.getSingleResult();
        return reserv;
    }
    /**
     * 
     * @method eliminar
     * @param reserva .
     * 
     */
    public void eliminar(Reserva reserva) {
        ReservaDao reservDao = new ReservaDao(em);
        Reserva reserv = reservDao.mostrarReserva(reserva);
        em.remove(reserv);

    }
    /**
     * 
     * @method agregar
     * @param reserva .
     * @throws ExisteReservaException .
     */
    public void agregar(Reserva reserva) {
        em.persist(reserva);
    }

    /**
     * 
     * Metodo que muestra las reservas de un solo usuario.
     * @param user .
     * @return lista de reservas de un usuario
     */
    public List<Reserva> mostrarReservaDeUsuario(Usuario user) {
        Query q =
                em.createQuery("SELECT r FROM Reserva r "
        + "WHERE usuario_id=:idUser");
        q.setParameter("idUser", user.getId());
        List<Reserva> lista = q.getResultList();
        return lista;

    }
}
